package com.battery.system.service.battery.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.battery.common.core.text.Convert;
import com.battery.common.enums.DevMealTimeEnum;
import com.battery.common.enums.RLineMealTimeEnum;
import com.battery.common.enums.YesOrNoEnum;
import com.battery.common.utils.BatteryJSONResult;
import com.battery.common.utils.DateUtils;
import com.battery.system.domain.*;
import com.battery.system.domain.BO.StoreBO;
import com.battery.system.domain.VO.*;
import com.battery.system.mapper.MerchantMapper;
import com.battery.system.mapper.StoreInstallMapper;
import com.battery.system.mapper.StoreMapper;
import com.battery.system.mapper.StoreSiteMapper;
import com.battery.system.service.battery.IStoreService;
import com.battery.system.service.impl.BaseServiceImpl;
import me.chanjar.weixin.common.util.DataUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 门店信息Service业务层处理
 *
 * @author battery
 * @date 2021-01-22
 */
@Service
public class StoreServiceImpl extends BaseServiceImpl<Store> implements IStoreService {
    @Autowired
    private StoreMapper storeMapper;


    @Autowired
    private StoreSiteMapper storeSiteMapper;


    @Autowired
    private StoreInstallMapper storeInstallMapper;


    @Autowired
    private MerchantMapper merchantMapper;

    /**
     * 查询门店信息
     *
     * @param id 门店信息ID
     * @return 门店信息
     */
    @Override
    public Store selectStoreById(String id) {
        return storeMapper.selectStoreById(id);
    }

    /**
     * 查询门店信息列表
     *
     * @param store 门店信息
     * @return 门店信息
     */
    @Override
    public List<Store> selectStoreList(Store store) {
        return storeMapper.selectStoreList(store);
    }

    /**
     * 新增门店信息
     *
     * @param store 门店信息
     * @return 结果
     */
    @Override
    public int insertStore(Store store) {
        store.setSigningTime(DateUtils.getNowDate());
        return storeMapper.insertStore(store);
    }

    /**
     * 修改门店信息
     *
     * @param store 门店信息
     * @return 结果
     */
    @Override
    public int updateStore(Store store) {
        store.setUpdateTime(DateUtils.getNowDate());
        return storeMapper.updateStore(store);
    }

    /**
     * 删除门店信息对象
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    @Override
    public int deleteStoreByIds(String ids) {
        return storeMapper.deleteStoreByIds(Convert.toStrArray(ids));
    }

    /**
     * 删除门店信息信息
     *
     * @param id 门店信息ID
     * @return 结果
     */
    @Override
    public int deleteStoreById(String id) {
        return storeMapper.deleteStoreById(id);
    }

    /**
     * @param storeBO
     * @return
     */
    @Override
    public List<StoreVO> selectStoreVOList(StoreBO storeBO) {
        return storeMapper.selectStoreVOList(storeBO);
    }

    @Override
    public List<StoreVV> selectStoreVVList(String id, int sort, String storeId, String merchantId) {
        return storeMapper.selectStoreVVList(id, sort, storeId, merchantId);
    }

    @Override
    public List<DeviceVV> selectStoreVVById(String id, String type) {
        return storeMapper.selectStoreVVById(id, type);
    }

    @Override
    public StoreVD selectStoreByIdToMerchant(String id) {
        return storeMapper.selectStoreByIdToMerchant(id);
    }

    /**
     * 获取附近门店信息
     *
     * @param map
     * @return
     */
    @Override
    public List<StoreVO> getShopList(Map<String, Object> map) {
        return storeMapper.getShopList(map);
    }

    /**
     * 获取附近门店个数
     *
     * @param map
     * @return
     */
    @Override
    public Integer selectStoreCountNear(Map<String, Object> map) {
        return storeMapper.getShopListCount(map);
    }

    @Override
    public IncomeTrend selectByStoreIdToIncome(String id, String type, String partnerId) {
        return storeMapper.selectByStoreIdToIncome(id, type, partnerId);
    }

    /**
     * 根据商户ID查询是否存在 门店
     *
     * @param MerchantId
     * @return
     */
    @Override
    public boolean checkStoreByMerchantId(String MerchantId) {
        Example example = new Example(Store.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("isDelete", YesOrNoEnum.NO.getCode());
        criteria.andEqualTo("merchantId", MerchantId);
        return storeMapper.selectCountByExample(example) > 0;
    }

    /**
     * 校验门店名是否重复
     *
     * @param storeName
     * @return
     */
    @Override
    public boolean checkStoreByStoreName(String storeName) {
        Example example = new Example(Store.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("isDelete", YesOrNoEnum.NO.getCode());
        criteria.andEqualTo("storeName", storeName);
        return storeMapper.selectCountByExample(example) > 0;
    }

    @Override
    public Store selectByStoreName(String storeName) {
        Example example = new Example(Store.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("isDelete", YesOrNoEnum.NO.getCode());
        criteria.andEqualTo("storeName", storeName);
        return storeMapper.selectOneByExample(example);
    }


    @Override
    public List<MerchantExcelVO> selectStoreExcelVOList(StoreBO storeBO) {
        return storeMapper.selectStoreExcelVOList(storeBO);
    }

    /**
     * 查看门店详情数据
     *
     * @param id
     * @return
     */
    @Override
    public StoreDetailVo selectStoreDetailVo(String id) {
        StoreDetailVo storeDetailVo = new StoreDetailVo();
        Store store = storeMapper.selectByPrimaryKey(id);

        storeDetailVo.setStoreId(store.getId());

        storeDetailVo.setStoreStatusMsg("未签约"); // 门店状态描述 是否签约商户
        storeDetailVo.setStoreName(store.getStoreName());
        storeDetailVo.setLocation(store.getLocation());
        storeDetailVo.setDetailAddress(store.getDetailAddress());
        StoreSite storeSite = storeSiteMapper.selectStoreSiteById(store.getSiteId());
        storeDetailVo.setSiteMsg(storeSite.getName());
        // 是否为连锁店 0 否 1 是
        if (store.getIsChain() == 0) {
            storeDetailVo.setIsChainMsg("否");
        } else {
            storeDetailVo.setIsChainMsg("是");
        }
        storeDetailVo.setPerConsume(store.getPerConsume());
        storeDetailVo.setSigningTime(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, store.getSigningTime()));
        storeDetailVo.setCreateTime(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, store.getCreateTime()));

        // 门店联系人类型 1 老板 2 店长 3 店员
        if (store.getStoreContactsType() == 1) {
            storeDetailVo.setStoreContactsTypeMsg("老板");
        } else if (store.getStoreContactsType() == 2) {
            storeDetailVo.setStoreContactsTypeMsg("店长");
        } else {
            storeDetailVo.setStoreContactsTypeMsg("店员");
        }
        if (StringUtils.isBlank(store.getStoreContactsName())) {
            storeDetailVo.setStoreContactsName("");
        } else {
            storeDetailVo.setStoreContactsName(store.getStoreContactsName());
        }
        if (StringUtils.isBlank(store.getStoreContactsPhone())) {
            storeDetailVo.setStoreContactsPhone("");
        } else {
            storeDetailVo.setStoreContactsPhone(store.getStoreContactsPhone());
        }
        StoreInstall storeInstall = storeInstallMapper.selectByPrimaryKey(store.getId());
        String mealMsg = "";
        String freeMsg = "";
        if (storeInstall.getFreeM() > 0) {
            freeMsg = "前" + storeInstall.getFreeM() + "分钟免费,";
        }
        if (DevMealTimeEnum.HALF_HOUR.type.intValue() == storeInstall.getUnitTime().intValue()) {
            mealMsg = mealMsg + freeMsg + storeInstall.getPrice() + "元/半小时,每日封顶" + storeInstall.getDayMax() + "元";
        } else if (DevMealTimeEnum.FIFTEEN_MINUTES.type.intValue() == storeInstall.getUnitTime().intValue()) {
            mealMsg = mealMsg + freeMsg + storeInstall.getPrice() + "元/15分钟,每日封顶" + storeInstall.getDayMax() + "元";
        } else {
            mealMsg = mealMsg + freeMsg + storeInstall.getPrice() + "元/小时,每日封顶" + storeInstall.getDayMax() + "元";
        }
        storeDetailVo.setBatteryMealMsg(mealMsg);
        if (StringUtils.isBlank(storeInstall.getChargerPrice())) {
            storeDetailVo.setLineMealMsg("");
        } else {
            String lineMealMsg = "";
            JSONArray arr = JSON.parseArray(storeInstall.getChargerPrice());
            for (int i = 0; i < arr.size(); i++) {
                JSONObject object = arr.getJSONObject(i);
                String minute = object.getString("min");
                BigDecimal money = object.getBigDecimal("money");
                if (RLineMealTimeEnum.ONE_HOUR.type.equals(minute)) {
                    lineMealMsg = lineMealMsg + "1小时" + money + "元,";
                } else if (RLineMealTimeEnum.THREE_HOUR.type.equals(minute)) {
                    lineMealMsg = lineMealMsg + "3小时" + money + "元,";
                } else if (RLineMealTimeEnum.FIVE_HOUR.type.equals(minute)) {
                    lineMealMsg = lineMealMsg + "5小时" + money + "元,";
                } else if (RLineMealTimeEnum.TWELVE_HOUR.type.equals(minute)) {
                    lineMealMsg = lineMealMsg + "12小时" + money + "元,";
                }
            }
            storeDetailVo.setLineMealMsg(lineMealMsg);
        }
        Merchant merchant = merchantMapper.selectByPrimaryKey(store.getMerchantId());
        if (merchant != null) {
            storeDetailVo.setStoreStatusMsg("已签约");
            if (merchant.getSubjectType() == 1) {
                storeDetailVo.setSubjectTypeMsg("企业");
            } else {
                storeDetailVo.setSubjectTypeMsg("个人");
            }
            storeDetailVo.setFullName(merchant.getFullName());
            storeDetailVo.setPhone(merchant.getPhone());
            storeDetailVo.setShareRatio(merchant.getShareRatio());
            storeDetailVo.setCashoutMoney(merchant.getCashoutMoney());
            storeDetailVo.setFrozenMoney(merchant.getFrozenMoney());
            storeDetailVo.setTotalRevenue(merchant.getTotalRevenue());
        } else {
            storeDetailVo.setSubjectTypeMsg("");
            storeDetailVo.setFullName("");
            storeDetailVo.setPhone("");
            storeDetailVo.setShareRatio(BigDecimal.ZERO);
            storeDetailVo.setCashoutMoney(BigDecimal.ZERO);
            storeDetailVo.setFrozenMoney(BigDecimal.ZERO);
            storeDetailVo.setTotalRevenue(BigDecimal.ZERO);
        }
        return storeDetailVo;
    }
}
